package main

import (
	"fmt"
	"runtime"
	"time"
)

/**
	协程
	轻量级的线程
	非抢占式多任务处理，由协程主动交出控制权
	多个协程可能在一个或者多个线程上运行
	定义：
	1.在函数前加go
	2.不需要在定义时区分是否是异步函数
	3.调度器在合适的点进行切换
	4.使用-race来检测
	切换点：
	1.io, select
	2.channel
	3.等待锁
	4.函数调用
	5.runtime.Gosched
 */
func main() {
	var a [10]int
	for i := 0; i < 10; i ++ {
		go func(i int) {  //go run -race xx.go 数据检测
			for {
				//fmt.Printf("hello from "+
				//	"goroutine %d \n", i)  //io操作
				a[i]++
				runtime.Gosched() //交出控制权，切换到其它协程使用
			}
		}(i)
 	}
 	time.Sleep(time.Millisecond)
	fmt.Println(a)
}
